package cn.lcsjsxy.junit.year2023.real;

/**
 * 题目2：
 * 根据输入的年份和月份判断月份的天数。若月份不在有效范围之内，应提示：“月份输入不正确。”。
 * 月份不为2月，根据输入月份输出对应的月份天数。月份为2月，根据年份判断如为普通闰年，输出2月份正确天数；
 * 如为世纪闰年，输出2月份正确天数；不为闰年输出2月份天数。返回结果格式：“year年month月份的天数是days天。
 * ”year、month为传入的值，days为判断得到的天数值。其中变量year、month均须为正整数。
 * 编写程序代码，使用JUnit框架编写测试类对编写的程序代码进行测试，测试类中设计最少的测试数据满足语句覆盖测试，每条测试数据需要在测试类中编写一个测试方法。
 * 使用assertThat中equalTo断言判断返回期望结果和实际返回是否一致。
 */
public class MonthDaysChecker {

    public static String getMonthDays(int year, int month) {
        // 检查月份是否在有效范围
        if (month < 1 || month > 12) {
            return "月份输入不正确。";
        }

        // 检查年份和月份是否为正整数
        if (year <= 0 || month <= 0) {
            return "年份或月份输入不正确。";
        }

        // 判断月份天数
        int days;
        switch (month) {
            case 2: // 2月需要判断闰年
                if (isLeapYear(year)) {
                    days = 29;
                } else {
                    days = 28;
                }
                break;
            case 4: // 4月
            case 6: // 6月
            case 9: // 9月
            case 11: // 11月
                days = 30;
                break;
            default: // 其他月份
                days = 31;
                break;
        }

        return year + "年" + month + "月份的天数是" + days + "天。";
    }

    // 判断是否为闰年
    private static boolean isLeapYear(int year) {
        if (year % 400 == 0) {
            return true; // 世纪闰年
        } else if (year % 100 == 0) {
            return false; // 非闰年
        } else {
            return year % 4 == 0; // 普通闰年
        }
    }
}